package de.vibes.beans;

import org.apache.commons.configuration.ConfigurationException;
import org.apache.log4j.Logger;
import org.neodatis.odb.ODBRuntimeException;

import de.vibes.model.Person;
import de.vibes.model.Vibe;

public class PersonBean {
	/**
	 * Logger for this class
	 */
	private static final Logger logger = Logger.getLogger(PersonBean.class);

	private Person person;
	private boolean loggedIn = false;

	private String username = "";
	private String password = "";

	/* Um einen neuen "Vibe" zu erstellen */
	private String newVibeText;
	private int newVibeLvl;

	/* Mehr schreiben... */
	private String newVibeMoreText;

	/***************************************************************
	 * Mit dieser Methode versucht man in das System einzuloggen.
	 * 
	 * @return
	 ***************************************************************/
	public String tryToLogin() {
		try {
			person = Person.findPerson(getUsername());
		} catch (ConfigurationException e) {
			// TODO Fehlerbearbeitung
			logger.error("Konfigurationsdatei konnte nicht gelesen werden.",e);
		} catch (ODBRuntimeException e) {
			// TODO Fehlerbearbeitung
			logger.error("Fehler im Neodatis Datenbank.",e);
		}
		if (person != null) {
			if (password.equals(person.getPassword())) {
				setLoggedIn(true);
			} else {
				return "pretty:login";
			}
		}
		setUsername("");
		setPassword("");
		return "pretty:home";
	}

	/**********************************************************************************
	 * Mit dieser Methode wird eine neue Person erstellt.
	 * 
	 * @return
	 *********************************************************************************/
	public String createPerson() {
		if (!username.isEmpty()) {
			try {
				if (Person.findPerson(username) == null) {
					// TODO Validator, ob username und passwort gültig sind.
					setPerson(new Person(username, password));
					getPerson().save();
					setLoggedIn(true);
				} else {
					// Person mit diesem Nickname existiert schon.
					// TODO Fehlerbearbeitung. Gedanken über allgemeine
					// Fehlerbearbeitung....
					String errorMessage = "Person mit dem Username: "
							+ username + " ist schon in dem System angemeldet.";
					logger.info(errorMessage);
					return logout();
				}
			} catch (ConfigurationException e) {
				// TODO Fehlerbearbeitung
				e.printStackTrace();
			}
		}
		return "pretty:home";
	}

	/**********************************************************************
	 * Mit dieser Methode loggt sich der Benutzer aus dem System raus.
	 * 
	 * @return
	 **********************************************************************/
	public String logout() {
		setUsername("");
		setPassword("");
		setPerson(null);
		setLoggedIn(false);
		return "pretty:home";
	}

	/************************************************************************
	 * Mit dieser Methode erstellt man einen neuen Beitrag.
	 * 
	 * @return
	 ************************************************************************/
	public String addVibe() {
		// TODO Fehlerbearbeitung.
		if (getNewVibeText() != null) {
			// TODO wiederholungen ausschliessen.
			Vibe vibe;
			try {
				vibe = new Vibe(newVibeText, newVibeMoreText, getNewVibeLvl(),
						person.getId());
				for (Vibe oldVibe : getPerson().getVibes()) {
					// wenn es schon identischen beitrag gibts - nicht
					// speichern.
					if (oldVibe.getLvl() == vibe.getLvl()
							&& oldVibe.getText().equals(vibe.getText())) {
						// TODO Fehlerbearbeitung
						clearVibe();
						return "pretty:";
					}
				}
				getPerson().getVibes().add(
						new Vibe(newVibeText, newVibeMoreText, getNewVibeLvl(),
								person.getId()));
			} catch (ConfigurationException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		} else {
			logger
					.debug("Eintrag wurde nicht gespeichert, da newVibeText ist null");
		}

		try {
			getPerson().save();
		} catch (ConfigurationException e) {
			// TODO Fehlerbearbeitung.
			e.printStackTrace();
		}
		clearVibe();
		return "pretty:home";
	}

	/************************************************************************
	 * Löscht Inhalte aus temporären Variablen.
	 ***********************************************************************/
	private void clearVibe() {
		newVibeLvl = 0;
		newVibeMoreText = null;
		newVibeText = null;
	}

	public void setPerson(Person person) {
		this.person = person;
	}

	public Person getPerson() {
		return person;
	}

	public void setLoggedIn(boolean loggedIn) {
		this.loggedIn = loggedIn;
	}

	public boolean isLoggedIn() {
		return loggedIn;
	}

	public void setPassword(String password) {
		this.password = password;
	}

	public String getPassword() {
		return password;
	}

	public void setUsername(String username) {
		this.username = username;
	}

	public String getUsername() {
		return username;
	}

	public void setNewVibeText(String newVibeText) {
		this.newVibeText = newVibeText;
	}

	public String getNewVibeText() {
		return newVibeText;
	}

	public void setNewVibeLvl(int newVibeLvl) {
		this.newVibeLvl = newVibeLvl;
	}

	public int getNewVibeLvl() {
		return newVibeLvl;
	}

	public void setNewVibeMoreText(String newVibeMoreText) {
		this.newVibeMoreText = newVibeMoreText;
	}

	public String getNewVibeMoreText() {
		return newVibeMoreText;
	}

}
